<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Generator.prototype.throw()</title>
</head>
<body>
    <h1>Generator.prototype.throw()</h1>
    <h2>Generator函数返回的遍历器对象，都有一个throw方法</h2>

    <script>
        // 基本用法
        function* gen() {
            try {
                yield 'hello';
            } catch (e) {
                console.log('内部捕获:', e);
            }
            yield 'world';
            yield 'ending';
        }

        const g = gen();
        console.log(g.next());
        
        try {
            g.throw('出错了');
            // g.throw(new Error('出错了')); // 也可以抛出错误对象
        } catch (e) {
            console.log('外部捕获:', e);
        }
        console.log(g.next());

        // throw方法与g.throw方法的区别
        function* gen2() {
            while(true) {
                try {
                    yield;
                } catch (e) {
                    if (e != 'a') throw e;
                    console.log('内部捕获:', e);
                }
            }
        }

        const i = gen2();
        i.next();

        try {
            throw new Error('a');
            // 这种方式抛出的错误，Generator函数内部捕获不到
        } catch (e) {
            console.log('外部捕获:', e);
        }

        i.throw('a');
        // 这种方式抛出的错误，可以被Generator函数内部捕获
        i.throw('b');
        // 这种方式抛出的错误，由于内部没有处理，被抛到外部
    </script>
</body>
</html> 